home *** CD-ROM | disk | FTP | other *** search
- unit AutoRptBtnsU;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- ExtCtrls, ComCtrls, ToolWin, StdCtrls, Buttons;
-
- type
- TForm1 = class(TForm)
- ToolBar1: TToolBar;
- ToolButton1: TToolButton;
- Timer1: TTimer;
- Button1: TButton;
- SpeedButton1: TSpeedButton;
- procedure AutoRepeatMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure AutoRepeatMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure AutoRepeatMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- procedure Timer1Timer(Sender: TObject);
- procedure ToolButton1Click(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure SpeedButton1Click(Sender: TObject);
- private
- Ctrl: TControl;
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.DFM}
-
- const
- InitRepeatPause = 400; { pause before repeat timer starts (ms) }
- RepeatPause = 200; { pause before successive hits (ms)}
-
- type
- //Access class needed to get at Click method,
- //which is protected in the TControl base class.
- //TControl is used so this code will work against
- //any visual control with an OnClick event handler
- TControlAccess = class(TControl);
-
- procedure TForm1.AutoRepeatMouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- begin
- Ctrl := Sender as TControl;
- Timer1.Interval := InitRepeatPause;
- Timer1.Enabled := True;
- //Don't let the normal click happen when mouse is released,
- //just the faked clicks from the timer will suffice
- Ctrl.ControlState := Ctrl.ControlState - [csClicked];
- end;
-
- procedure TForm1.AutoRepeatMouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- //If timer didn't tick at all, do one click
- if Timer1.Enabled and (Timer1.Interval = InitRepeatPause) then
- TControlAccess(Ctrl).Click;
- Timer1.Enabled := False;
- Ctrl := nil;
- end;
-
- procedure TForm1.AutoRepeatMouseMove(Sender: TObject; Shift: TShiftState;
- X, Y: Integer);
- begin
- if Assigned(Ctrl) and (csLButtonDown in Ctrl.ControlState) then
- with Ctrl do
- Timer1.Enabled := PtInRect(Rect(0, 0, Width, Height), Point(X, Y))
- end;
-
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
- Timer1.Interval := RepeatPause;
- try
- TControlAccess(Ctrl).Click;
- //If button has been disabled as a result of what
- //happens in its OnClick method, shutdown timer
- Timer1.Enabled := Ctrl.Enabled;
- except
- Timer1.Enabled := False;
- raise;
- end;
- end;
-
- procedure TForm1.ToolButton1Click(Sender: TObject);
- begin
- Beep
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Color := Random($1000000);
- end;
-
- procedure TForm1.SpeedButton1Click(Sender: TObject);
- begin
- Caption := TimeToStr(Time)
- end;
-
- initialization
- Randomize
- end.
-